import java.util.Objects;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-04-07
 * Time: 15:53
 */
public class Main {
    public static void main(String[] args) {
        // 示例 1: 使用字面量创建字符串（常量池优化）
        String str1 = "hello";
        String str2 = "hello";
        System.out.println("示例 1:");
        System.out.println("str1 == str2      : " + (str1 == str2));      // true，因为指向常量池中的同一个对象
        System.out.println("str1.equals(str2) : " + str1.equals(str2));   // true，内容相同

        // 示例 2: 使用 new 创建字符串（堆内存中新对象）
        String str3 = new String("hello");
        String str4 = new String("hello");
        System.out.println("\n示例 2:");
        System.out.println("str3 == str4      : " + (str3 == str4));      // false，因为堆中是不同的对象
        System.out.println("str3.equals(str4) : " + str3.equals(str4));   // true，内容相同

        // 示例 3: 比较字面量和 new 创建的字符串
        System.out.println("\n示例 3:");
        System.out.println("str1 == str3      : " + (str1 == str3));      // false，内存地址不同
        System.out.println("str1.equals(str3) : " + str1.equals(str3));   // true，内容相同

        // 示例 4: 比较 null 的情况
        String str5 = null;
        String str6 = "hello";
        System.out.println("\n示例 4:");
         //System.out.println(str5.equals(str6));  // 抛出 NullPointerException
        System.out.println("安全的比较方式 : " + (str6.equals(str5)));  // false，s5 是 null
        // 更安全的比较方式：使用 Objects.equals() 避免 NPE
        System.out.println("使用 Objects.equals(): " + Objects.equals(str5,str6)); // false

        System.out.println("\n");
        System.out.println("=====关于String类的equals方法源码关键=====");
        //1. 快速判断是否为同一对象 (this == anObject)。作用如果两个对象的内存地址相同，直接返回 true，无需进一步比较。
        String s1 = "hello";
        String s2 = s1;  // s2 和 s1 指向同一内存地址
        System.out.println(s1.equals(s2)); // true (直接通过步骤 1 返回)
        //2. 类型检查 (anObject instanceof String)。作用确保被比较的对象是 String 类型。
        String s = "hello";
        Integer num = 123;
        System.out.println(s.equals(num)); // false (步骤 2 直接返回)
        // 3.长度检查 (n == anotherString.value.length)。作用如果两个字符串长度不同，直接返回 false。
        String s3 = "hello";
        String s4 = "hell";
        System.out.println(s3.equals(s4)); // false (步骤 4 返回)
        // 4.逐字符比较 (while (n-- != 0))。作用逐个字符比对两个字符数组。
        String s5 = "hello";
        String s6 = "hallo"; // 第三个字符不同（'e' vs 'a'）
        System.out.println(s5.equals(s6)); // false (步骤 5 发现字符不同)
    }
}
